/*
 * @Author: yourname your-email-address
 * @Date: 2024-01-11 15:57:43
 * @LastEditors: yourname your-email-address
 * @LastEditTime: 2024-01-11 18:05:46
 * @FilePath: \json1\leptjson.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "leptjson.h"
#define EXPECT(c,ch) do{assert(*c->json == (ch)); c->json++;} while(0)

typedef struct {
    const char* json;
}lept_context;
static void lept_parse_whilespace(lept_context * c)
{
    char *p = c->json;

    while(*p == ' ' || *p == '\t' || *p == '\n' || *p== '\r')
        p++;
    c->json = p;
}
static int lept_parse_null(lept_context *c,lept_value *v)
{
    EXPECT(c,'n');

    if(c->json[0] != 'u'  || c->json[1] != 'l' || c->json[2] != 'l')
        return LEPT_PARSE_INVALID_VALUE;
    c->json +=3;
    v->type = LEPT_NULL;
    return LEPT_PARSE_OK;
}
static int lept_parse_value(lept_context *c,lept_value *v)
{
    switch (*c->json)
    {
        case 'n' : return lept_parse_null(c,v);
        case '\0' : return LEPT_PARSE_EXPECT_VALUE;
        default:
            return LEPT_PARSE_INVALID_VALUE;
    }
    
}
int lept_parse(lept_value* v, const char* json)
{
    lept_context c;
    assert(v != NULL);
    c.json = json;
    v->type = LEPT_NULL;
    lept_parse_whilespace(&c);
    return lept_parse_value(&c,v);
}
lept_type lept_get_type(const lept_value* v)
{
    assert(v!=NULL);
    return v->type;
}